package com.hspedu.tankgame3;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Iterator;
import java.util.Vector;

/**
 * @author DL5O
 * @version 1.0
 * 坦克大战的绘图区域
 */
//为了监听事件需要实现 KeyListener
//为了让panel 不停的重绘子弹，需要将 MyPanel 实现一个Runnable 接口
public class MyPanel extends JPanel implements KeyListener,Runnable{
    //定义我的坦克
    private Hero hero = null;//玩家坦克
    Vector<EnemyTank> enemyTanks = new Vector<EnemyTank>();//用于存放敌人tank
    int enemyTankSize = 3;

    public MyPanel() {
        this.hero = new Hero(200, 250, 1, 20);//初始化一个自己的Tank
        for (int i = 0; i < enemyTankSize; i++) {
            //enemyTanks.add(new EnemyTank(x, 100, 0, 5));
            EnemyTank enemyTank = new EnemyTank((100 * (i + 1)), 0, 0, 5);
            //设置方向
            enemyTank.setDirect(2);
            //加入集合
            enemyTanks.add(enemyTank);
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    //处理wasd键按下的键
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W) {//按下w键
            //改变坦克的方向
            hero.setDirect(0);
            hero.moveUp();

        } else if (e.getKeyCode() == KeyEvent.VK_D) {//D
            hero.setDirect(1);
            hero.moveRight();
        } else if (e.getKeyCode() == KeyEvent.VK_S) {//S
            hero.setDirect(2);
            hero.moveDown();
        } else if (e.getKeyCode() == KeyEvent.VK_A) {//A
            hero.setDirect(3);
            hero.moveLeft();
        }

        //当用户按下J键，就发射
        if (e.getKeyCode() == KeyEvent.VK_J) {
            System.out.println("按下J键,子弹开始射击");
            hero.shotEnemy();
        }
        repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0, 0, 1000, 750);//填充矩形，默认是黑色
        //画出坦克-封装到方法

        //画出玩家的坦克
        drawTank(hero.getX(), hero.getY(), g, hero.getDirect(), hero.getType());
        //画出玩家坦克 打出的子弹
        if (hero.shot != null && hero.shot.isLive == true) {
            System.out.println("子弹被绘制...");
            //g.fill3DRect(hero.shot.x,hero.shot.y,3,3,false);
            g.setColor(Color.yellow);
            g.draw3DRect(hero.shot.x,hero.shot.y,2,2,false);
        }


        //画出敌人坦克
        Iterator<EnemyTank> iterator = enemyTanks.iterator();
        while (iterator.hasNext()) {
            EnemyTank enemyTank = iterator.next();
            drawTank(enemyTank.getX(), enemyTank.getY(), g, enemyTank.getDirect(), enemyTank.getType());
        }

    }

    /**
     * 编写方法，画出坦克
     *
     * @param x      坦克的x坐标
     * @param y      坦克的y坐标
     * @param g      画笔
     * @param direct 坦克的方向
     * @param type   坦克的类型 0代表敌人的坦克，1代表玩家的坦克
     */
    public void drawTank(int x, int y, Graphics g, int direct, int type) {
        //根据不同的坦克类型，设置不同的颜色
        switch (type) {
            case 0://敌人的tank
                g.setColor(Color.cyan);
                break;
            case 1:
                g.setColor(Color.yellow);
                break;
        }

        //根据坦克的方向来绘制对应形状的tank
        //direct 表示方向，分别用(0 向上 1向右 2向下 3向左)
        switch (direct) {
            case 0://向上的
                g.fill3DRect(x, y, 10, 60, false);//画出左边的轮子
                g.fill3DRect(x + 10, y + 10, 20, 40, false);//中间的矩形
                g.fillOval(x + 10, y + 20, 20, 20);//坦克轮盘
                g.drawLine(x + 20, y + 30, x + 20, y);//坦克的炮筒
                g.fill3DRect(x + 30, y, 10, 60, false);//画出右边的矩形
                break;
            case 1://向右边的
                g.fill3DRect(x, y, 60, 10, false);//画出左边的轮子
                g.fill3DRect(x + 10, y + 10, 40, 20, false);//中间的矩形
                g.fillOval(x + 20, y + 10, 20, 20);//坦克轮盘
                g.drawLine(x + 30, y + 20, x + 60, y + 20);//坦克的炮筒
                g.fill3DRect(x, y + 30, 60, 10, false);//画出右边的矩形
                break;
            case 2://向下
                g.fill3DRect(x, y, 10, 60, false);//画出左边的轮子
                g.fill3DRect(x + 10, y + 10, 20, 40, false);//中间的矩形
                g.fillOval(x + 10, y + 20, 20, 20);//坦克轮盘
                g.drawLine(x + 20, y + 30, x + 20, y + 60);//坦克的炮筒
                g.fill3DRect(x + 30, y, 10, 60, false);//画出右边的矩形
                break;
            case 3://向左
                g.fill3DRect(x, y, 60, 10, false);//画出左边的轮子
                g.fill3DRect(x + 10, y + 10, 40, 20, false);//中间的矩形
                g.fillOval(x + 20, y + 10, 20, 20);//坦克轮盘
                g.drawLine(x + 30, y + 20, x, y + 20);//坦克的炮筒
                g.fill3DRect(x, y + 30, 60, 10, false);//画出右边的矩形
                break;
            default:
                System.out.println("暂时没有处理");
        }
    }


    @Override
    public void run() {
        //每隔100毫秒，重绘这个区域
        while(true){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.repaint();
        }

    }
}
